home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Software Contest 3 / FM Towns Software Contest 3.iso / exp / telop / denko / pro20.asm < prev    next >
Assembly Source File  |  1994-01-07  |  9KB  |  494 lines

  1.  
  2.     assume    cs:code,ds:data,es:data,fs:data,gs:data,ss:sseg
  3.  
  4. code    segment
  5.  
  6. entry:    push    110h
  7.     pop    fs
  8.     call    crtc_set
  9.     call    vram_clear
  10.  
  11.     call    msgfile_read
  12.     jc    exit
  13.  
  14. title_back:
  15.     call    opening_put
  16.  
  17.     call    board_put
  18.  
  19.     cli
  20.     push    120h
  21.     pop    es
  22.     mov    edi,140*512*2
  23.     mov    ecx,8
  24. init:    add    edi,32*2
  25.     call    space_put
  26.     loop    init
  27.     mov    eax,0101001111000000b
  28.     lea    esi,stringswork
  29.  
  30. main:    movzx    ebx,byte ptr ds:[statuswork]
  31.     lea    ebx,[sub_label+ebx*4]
  32.     call    cs:[ebx]
  33.     jmp    main
  34. sub_label:
  35.     dd    normal,return_wait,pause,flash
  36.  
  37. exit:    sti
  38.     mov    ax,4c00h
  39.     int    21h
  40.  
  41. ;*******************************************************
  42. ;    normal    proc
  43. ;    コントロールコードのチェックと文字を書くルーチン
  44. ;*******************************************************
  45. normal    proc
  46.     mov    edi,dword ptr ds:[scrollwork]
  47.     test    edi,000000fh    ;16回に1回
  48.     jnz    #scroll
  49.     call    code_analyze
  50.     jc    #control_code_check
  51.     and    edi,255
  52.     lea    edi,[edi*4]    ;ebx=ebx*2*2
  53.     add    edi,32*2*9
  54.     and    edi,1023
  55.     add    edi,512*2*140
  56.     mov    bx,word ptr ds:[esi]
  57.     xchg    bh,bl
  58.     call    char_put
  59.     add    esi,2
  60. #scroll:call    scroll
  61.     call    vsync_wait
  62.     ret
  63. #control_code_check:
  64.     mov    bx,ds:[esi]
  65.     cmp    bl,'1'
  66.     jz    #color_change
  67.     cmp    bl,'2'
  68.     jz    #pause
  69.     cmp    bl,'3'
  70.     jz    #flash
  71.     cmp    bx,0a0dh    ;CR,LF code
  72.     jz    #return_wait
  73.     cmp    bl,1ah        ;EOFmark
  74.     jz    exit
  75.     cmp    bl,00h
  76.     jz    exit
  77.     cmp    bx,'40'
  78.     jz    #title_back
  79.     cmp    bx,'00'        ;END control code
  80.     jz    exit
  81.     cmp    bx,'50'
  82.     jnz    #error
  83.     lea    esi,[stringswork-1]
  84. #error:    inc    esi        ;not control code,illegal control code
  85.     ret
  86.  
  87. #color_change:
  88.     cmp    bh,'0'
  89.     js    #error
  90.     cmp    bh,'5'
  91.     jns    #error
  92.     sub    bh,'0'
  93.     movzx    ebx,bh
  94.     movzx    eax,word ptr ds:[#color_code+ebx*2]
  95.     add    esi,2
  96.     ret
  97. #color_code:
  98.     dw    0101001111000000b    ;orange
  99.     dw    0111101000000000b    ;green
  100.     dw    0000001111000100b    ;red
  101.     dw    0000000000011111b    ;blue
  102.     dw    0111111111100000b    ;yellow
  103.  
  104. #return_wait:
  105.     mov    byte ptr ds:[statuswork],1
  106.     mov    byte ptr ds:[timerwork],0
  107.     mov    edx,dword ptr ds:[scrollwork]
  108.     and    edx,255
  109.     lea    edx,[edx*4]    ;ebx=ebx*2*2
  110.     add    edx,32*2*9
  111.  
  112.     mov    ecx,8
  113. #r000:    mov    edi,edx
  114.     and    edi,1023
  115.     add    edi,512*2*140
  116.     call    space_put
  117.     add    edx,32*2
  118.     dec    ecx
  119.     jnz    #r000
  120.     add    esi,2
  121.     ret
  122.  
  123. #pause:    sub    bh,'0'-1
  124.     movzx    ebx,bh
  125.     shl    ebx,4
  126.     mov    ds:[timerwork],bl
  127.     mov    byte ptr ds:[statuswork],2
  128.     add    esi,2
  129.     ret
  130.  
  131. #flash:    sub    bh,'0'-1
  132.     movzx    ebx,bh
  133.     lea    ebx,[ebx*2]
  134.     mov    ds:[counterwork],bl
  135.     mov    byte ptr ds:[statuswork],3
  136.     mov    byte ptr ds:[timerwork],0
  137.     mov    edx,dword ptr ds:[scrollwork]
  138.     and    edx,255
  139.     lea    edx,[edx*4]    ;ebx=ebx*2*2
  140.     add    edx,32*2*9
  141.  
  142.     mov    ecx,8
  143. #f000:    mov    edi,edx
  144.     and    edi,1023
  145.     add    edi,512*2*140
  146.     call    space_put
  147.     add    edx,32*2
  148.     dec    ecx
  149.     jnz    #f000
  150.     add    esi,2
  151.     ret
  152.  
  153. #title_back:
  154.     sub    esp,4
  155.     jmp    title_back
  156. normal    endp
  157.  
  158. ;******************************************************
  159. ;    return_wait    proc
  160. ;    リターンコードの処理を行う
  161. ;******************************************************
  162. return_wait    proc
  163.     call    vsync_wait
  164.     inc    byte ptr ds:[timerwork]
  165.     cmp    byte ptr ds:[timerwork],128
  166.     jnz    #000
  167.     mov    byte ptr ds:[statuswork],0
  168.     mov    byte ptr ds:[timerwork],0
  169. #000:    call    scroll
  170.     ret
  171. return_wait    endp
  172.  
  173. ;******************************************************
  174. ;    pause    proc
  175. ;    一時停止の処理を行う
  176. ;******************************************************
  177. pause    proc
  178.     call    vsync_wait
  179.     dec    byte ptr ds:[timerwork]
  180.     jnz    #000
  181.     mov    byte ptr ds:[statuswork],0
  182. #000:    ret
  183. pause    endp
  184.  
  185. ;******************************************************
  186. ;    flash    proc
  187. ;    点滅の処理を行う
  188. ;******************************************************
  189. flash    proc
  190.     pushad
  191.     call    vsync_wait
  192.     mov    bl,ds:[timerwork]
  193.     test    bl,0001111b
  194.     jnz    #002c
  195.     mov    dx,0440h
  196.     mov    al,17
  197.     out    dx,al
  198.     add    dx,2
  199.     mov    eax,dword ptr ds:[scrollwork]
  200.     and    bl,0010000b
  201.     jnz    #001b
  202. #001a:    add    eax,16+16*8
  203.     and    eax,255
  204.     out    dx,ax
  205.     jmp    #002a
  206. #001b:    add    eax,16
  207.     and    eax,255
  208.     out    dx,ax
  209. #002a:    inc    byte ptr ds:[timerwork]
  210.     dec    byte ptr ds:[counterwork]
  211.     jnz    #002b
  212.     mov    byte ptr ds:[statuswork],0
  213.     mov    byte ptr ds:[timerwork],0
  214. #002b:    popad
  215.     ret
  216. #002c:    inc    byte ptr ds:[timerwork]
  217.     popad
  218.     ret
  219. flash    endp
  220.  
  221. ;******************************************************
  222. ;    msgfile_read    proc
  223. ;    コマンドラインのメッセージファイルを読み込む
  224. ;    out-----carryflag(0-no error,1-error)
  225. ;******************************************************
  226. msgfile_read    proc
  227.     pushad
  228.     push    ds
  229.     push    0024h            ;PSP selecter
  230.     pop    ds
  231.     mov    edx,0080h
  232.     movzx    eax,byte ptr ds:[edx]    ;eax=length
  233.     inc    edx
  234.     mov    byte ptr ds:[edx+eax],00h
  235.     mov    ax,3d00h        ;file open
  236.     int    21h
  237.     jc    #error
  238.     mov    bx,ax
  239.     mov    ecx,4*1024
  240.     pop    ds
  241.     lea    edx,stringswork
  242.     mov    ah,3fh            ;file read
  243.     int    21h
  244.     mov    ah,3eh            ;file close
  245.     int    21h
  246.     popad
  247.     ret
  248. #error:    pop    ds
  249.     popad
  250.     ret
  251. msgfile_read    endp
  252.  
  253. ;******************************************************
  254. ;    vsync_wait    proc
  255. ;    1/60秒のウェイトをいれる
  256. ;    No register
  257. ;******************************************************
  258. vsync_wait    proc
  259.     push    eax
  260.     push    edx
  261.     mov    dx,0fda0h
  262. #001:    in    al,dx
  263.     test    al,00000001b
  264.     jnz    #001
  265. #002:    in    al,dx
  266.     test    al,00000001b
  267.     jz    #002
  268.     pop    edx
  269.     pop    eax
  270.     ret
  271. vsync_wait    endp
  272.  
  273. ;******************************************************
  274. ;    code_analyze    proc
  275. ;    コードを解析する    (Oh!FM 1991-7 p91参照)
  276. ;    in----ds:esi=code address
  277. ;    out---carryflag(0-code=sjis,1-code=ank)
  278. ;******************************************************
  279. code_analyze    proc
  280.     pushad
  281.     lodsb
  282.     cmp    al,080h
  283.     jz    #ank
  284.     and    al,0f0h
  285.     cmp    al,0e0h
  286.     jz    #sjis
  287.     cmp    al,090h
  288.     jz    #sjis
  289.     cmp    al,080h
  290.     jz    #sjis
  291. #ank:    stc
  292.     popad
  293.     ret
  294. #sjis:    clc
  295.     popad
  296.     ret
  297. code_analyze    endp
  298.  
  299. ;******************************************************
  300. ;    scroll    proc
  301. ;    ページ0を2ドット左にスクロールさせる
  302. ;    No register
  303. ;******************************************************
  304. scroll    proc
  305.     pushad
  306.     inc    dword ptr ds:[scrollwork]
  307.     mov    dx,0440h
  308.     mov    al,17
  309.     out    dx,al
  310.     add    dx,2
  311.     mov    eax,dword ptr ds:[scrollwork]
  312.     add    eax,16
  313.     and    eax,255
  314.     out    dx,ax
  315.     popad
  316.     ret
  317. scroll    endp
  318.  
  319. ;******************************************************
  320. ;    crtc_set proc
  321. ;    画面モードセット
  322. ;    No register
  323. ;******************************************************
  324. crtc_set    proc
  325.     mov    ah,00h
  326.     lea    edi,tbioswork
  327.     mov    ecx,800h
  328.     call    pword ptr fs:[20h]
  329.  
  330.     mov    ax,0100h
  331.     mov    dx,10
  332.     call    pword ptr fs:[20h]
  333.     mov    ax,0101h
  334.     mov    dx,10
  335.     call    pword ptr fs:[20h]
  336.  
  337.     mov    ax,0500h        ;page0(font) write
  338.     call    pword ptr fs:[20h]
  339.     mov    ax,0202h
  340.     mov    bx,2
  341.     mov    dx,2
  342.     call    pword ptr fs:[20h]
  343.     mov    ax,0203h
  344.     mov    bx,240
  345.     mov    dx,32*8
  346.     call    pword ptr fs:[20h]
  347.     mov    ax,0200h
  348.     mov    bx,0
  349.     mov    dx,32
  350.     call    pword ptr fs:[20h]
  351.     mov    ax,0201h
  352.     mov    bx,0
  353.     mov    dx,32
  354.     call    pword ptr fs:[20h]
  355.  
  356.     mov    ax,0501h        ;page1(back graphic) write
  357.     call    pword ptr fs:[20h]
  358.     mov    ax,0202h
  359.     mov    dx,2
  360.     mov    bx,2
  361.     call    pword ptr fs:[20h]
  362.     mov    ax,0203h
  363.     mov    dx,320
  364.     mov    bx,240
  365.     call    pword ptr fs:[20h]
  366.  
  367.     mov    ax,0600h        ;priority 0>1
  368.     mov    edx,3
  369.     call    pword ptr fs:[20h]
  370.  
  371.     ret
  372. crtc_set    endp
  373.  
  374. ;******************************************************
  375. ;    vram_clear proc
  376. ;    ページ0,1を透明に塗りつぶす
  377. ;    No register
  378. ;******************************************************
  379. vram_clear    proc
  380.     pushad
  381.     push    es
  382.     push    120h
  383.     pop    es
  384.     mov    eax,80008000h
  385.     mov    ecx,512*1024/4
  386.     sub    edi,edi
  387.     rep stosd
  388.  
  389.     pop    es
  390.     popad
  391.     ret
  392. vram_clear    endp
  393.  
  394. ;******************************************************
  395. ;    char_put proc
  396. ;    SJISコードを表示する
  397. ;    edi=vram address
  398. ;    eax=character color(0000xxxxh)
  399. ;    bx=sjis code
  400. ;    es=vram selector
  401. ;    fs=tbios selectr
  402. ;******************************************************
  403. char_put    proc
  404.     pushad
  405.     push    ds
  406.     push    eax
  407.     movzx    ebx,bx
  408.     shl    bh,1
  409.     cmp    bl,080h
  410.     adc    bx,1f61h
  411.     add    bl,7fh
  412.     jc    short #001a
  413.     add    bl,0a2h
  414. #001a:    and    bh,7fh
  415.  
  416.     mov    ax,0100h
  417.     mov    dx,1010h
  418.     call    pword ptr fs:[0a0h]
  419.     cmp    ah,00h        ;code is not S-jis Code
  420.     jnz    exit
  421.  
  422.     pop    ebx
  423.  
  424.     sub    edx,edx
  425.     sub    ecx,ecx
  426. #002a:    lodsw        ;mov ax,ds:[esi]
  427.     xchg    ah,al
  428. #002b:    shl    ax,1
  429.     jnc    #002d
  430.     mov    dword ptr es:[edi],ebx
  431. #002c:    add    edi,4
  432.     inc    edx
  433.     cmp    edx,16
  434.     jnz    #002b
  435.     sub    edx,edx
  436.     add    edi,(1024-32)*2
  437.     inc    ecx
  438.     cmp    ecx,16
  439.     jnz    #002a
  440.     pop    ds
  441.     popad
  442.     ret
  443. #002d:    mov    dword ptr es:[edi],0100001000010000b
  444.     jmp    #002c
  445. char_put    endp
  446.  
  447. ;******************************************************
  448. ;    space_put proc
  449. ;    スペースを表示する
  450. ;    edi=vram address
  451. ;    es=vram selector
  452. ;    fs=tbios selectr
  453. ;******************************************************
  454. space_put    proc
  455.     pushad
  456.     sub    edx,edx
  457.     sub    ecx,ecx
  458.     mov    eax,0100001000010000b
  459. #000:    mov    dword ptr es:[edi],eax
  460.     add    edi,4
  461.     inc    edx
  462.     cmp    edx,16
  463.     jnz    #000
  464.     sub    edx,edx
  465.     add    edi,(1024-32)*2
  466.     inc    ecx
  467.     cmp    ecx,16
  468.     jnz    #000
  469.     popad
  470.     ret
  471. space_put    endp
  472.  
  473.     include    tif_read.asm
  474.  
  475. code    ends
  476.  
  477. data    segment
  478.  
  479. scrollwork    dd    00h
  480. tbioswork    db    800h dup(?)
  481. stringswork    db    4*1024 dup(?),00h
  482. statuswork    db    00h
  483. timerwork    db    00h
  484. counterwork    db    00h
  485. buffer        db    154112-512 dup(?)
  486.  
  487. data    ends
  488.  
  489. sseg    segment    stack
  490.     db    4096 dup(?)
  491. sseg    ends
  492.  
  493.     end    entry
  494.